#!/usr/bin/python3
# -*- coding:utf-8 -*-
"""
正常情况下，当我们定义了一个class，创建了一个class的实例后，我们可以给该实例绑定任何属性和方法，这就是动态语言的灵活性。
为了达到限制的目的，Python允许在定义class的时候，定义一个特殊的__slots__变量，来限制该class实例能添加的属性：
"""


class Student(object):
    __slots__ = ('name', 'age')    # 限制给student的实例绑定变只能是只能是name age
    pass


# __slots__定义的属性仅对当前类实例起作用，对继承的子类是不起作用的
class GradutaeStudent(Student):       # 父类中定义的__slots__ 对子类没用
    # 除非在子类中也定义__slots__，这样，子类实例允许定义的属性就是自身的__slots__加上父类的__slots__
    __slots__ = ('score')
    pass


def main():
    s = Student()
    s.name = '王楠'
    # s.num = 20   # 发生异常: AttributeError  :'Student' object has no attribute 'num'
    print(s.name)
    # print(s.num)
    s1 = GradutaeStudent()
    # s1.num = 20
    # print(s1.num)
    print(dir(Student))
    print(Student.__slots__)
    print(dir(GradutaeStudent))
    print(GradutaeStudent.__slots__)
    print(dir(s))
    print(dir(s1))


if __name__ == '__main__':
    main()
